package com.xukang.SM4;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class SM4Utils {
//	private String secretKey = "";  
//    private String iv = "";  
//    private boolean hexString = false;  
      
    public String secretKey = "";
    private String iv = "";
    public boolean hexString = false;  
    
    public SM4Utils()  
    {  
    }  

    public String encryptData_ECB(String plainText)
    {  
        try   
        {  
            SM4_Context ctx = new SM4_Context();  
            ctx.isPadding = true;  
            ctx.mode = SM4.SM4_ENCRYPT;  
              
            byte[] keyBytes;  
            if (hexString)  
            {  
                keyBytes = Utils.hexStringToBytes(secretKey);  
            }  
            else  
            {  
                keyBytes = secretKey.getBytes();  
            }  
              
            SM4 sm4 = new SM4();  
            sm4.sm4_setkey_enc(ctx, keyBytes);  
            byte[] encrypted = sm4.sm4_crypt_ecb(ctx, plainText.getBytes("GBK"));  
            String cipherText = new BASE64Encoder().encode(encrypted);
            if (cipherText != null && cipherText.trim().length() > 0)  
            {  
                Pattern p = Pattern.compile("\\s*|\t|\r|\n");
                Matcher m = p.matcher(cipherText);
                cipherText = m.replaceAll("");  
            }  
            return cipherText;  
        }   
        catch (Exception e)
        {  
            e.printStackTrace();  
            return null;  
        }  
    }  
      
    public String decryptData_ECB(String cipherText)
    {  
        try   
        {  
            SM4_Context ctx = new SM4_Context();  
            ctx.isPadding = true;  
            ctx.mode = SM4.SM4_DECRYPT;  
              
            byte[] keyBytes;  
            if (hexString)  
            {  
                keyBytes = Utils.hexStringToBytes(secretKey);  
            }  
            else  
            {  
                keyBytes = secretKey.getBytes();  
            }  
              
            SM4 sm4 = new SM4();  
            sm4.sm4_setkey_dec(ctx, keyBytes);  
            byte[] decrypted = sm4.sm4_crypt_ecb(ctx, new BASE64Decoder().decodeBuffer(cipherText));
            return new String(decrypted, "GBK");
        }   
        catch (Exception e)
        {  
            e.printStackTrace();  
            return null;  
        }  
    }  
      
    public static void main(String[] args) throws IOException
    {  
        String plainText = "ererfeiisgod";
          
        SM4Utils sm4 = new SM4Utils();  
        sm4.secretKey = "JeF8U9wHFOMfs2Y8";  
        sm4.hexString = false;  
          
        System.out.println("ECB模式加密");
        String cipherText = sm4.encryptData_ECB(plainText);
        System.out.println("密文: " + cipherText);
        System.out.println("");
          
        plainText = sm4.decryptData_ECB(cipherText);  
        System.out.println("明文: " + plainText);
        System.out.println("");
    }  
}